home *** CD-ROM | disk | FTP | other *** search
/ Programming Windows (5th Edition) / Programming Windows, 5th ed. - Companion CD (097-0002183)(1999).iso / Chap15 / DibConv / DibConv.c next >
Encoding:
C/C++ Source or Header  |  1998-10-09  |  6.9 KB  |  230 lines

  1. /*----------------------------------------
  2.    DIBCONV.C -- Converts a DIB to a DDB
  3.                 (c) Charles Petzold, 1998
  4.   ----------------------------------------*/
  5.  
  6. #include <windows.h>
  7. #include <commdlg.h>
  8. #include "resource.h"
  9.  
  10. LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
  11.  
  12. TCHAR szAppName[] = TEXT ("DibConv") ;
  13.  
  14. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
  15.                     PSTR szCmdLine, int iCmdShow)
  16. {
  17.      HWND     hwnd ;
  18.      MSG      msg ;
  19.      WNDCLASS wndclass ;
  20.  
  21.      wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  22.      wndclass.lpfnWndProc   = WndProc ;
  23.      wndclass.cbClsExtra    = 0 ;
  24.      wndclass.cbWndExtra    = 0 ;
  25.      wndclass.hInstance     = hInstance ;
  26.      wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
  27.      wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  28.      wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
  29.      wndclass.lpszMenuName  = szAppName ;
  30.      wndclass.lpszClassName = szAppName ;
  31.  
  32.      if (!RegisterClass (&wndclass))
  33.      {
  34.           MessageBox (NULL, TEXT ("This program requires Windows NT!"), 
  35.                       szAppName, MB_ICONERROR) ;
  36.           return 0 ;
  37.      }
  38.  
  39.      hwnd = CreateWindow (szAppName, TEXT ("DIB to DDB Conversion"),
  40.                           WS_OVERLAPPEDWINDOW,
  41.                           CW_USEDEFAULT, CW_USEDEFAULT,
  42.                           CW_USEDEFAULT, CW_USEDEFAULT, 
  43.                           NULL, NULL, hInstance, NULL) ;
  44.  
  45.      ShowWindow (hwnd, iCmdShow) ;
  46.      UpdateWindow (hwnd) ;
  47.  
  48.      while (GetMessage (&msg, NULL, 0, 0))
  49.      {
  50.           TranslateMessage (&msg) ;
  51.           DispatchMessage (&msg) ;
  52.  
  53.      }
  54.      return msg.wParam ;
  55. }
  56.  
  57. HBITMAP CreateBitmapObjectFromDibFile (HDC hdc, PTSTR szFileName)
  58. {
  59.      BITMAPFILEHEADER * pbmfh ;
  60.      BOOL               bSuccess ;
  61.      DWORD              dwFileSize, dwHighSize, dwBytesRead ;
  62.      HANDLE             hFile ;
  63.      HBITMAP            hBitmap ;
  64.  
  65.           // Open the file: read access, prohibit write access
  66.  
  67.      hFile = CreateFile (szFileName, GENERIC_READ, FILE_SHARE_READ, NULL, 
  68.                          OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL) ;
  69.  
  70.      if (hFile == INVALID_HANDLE_VALUE)
  71.           return NULL ;
  72.  
  73.           // Read in the whole file
  74.  
  75.      dwFileSize = GetFileSize (hFile, &dwHighSize) ;
  76.  
  77.      if (dwHighSize)
  78.      {
  79.           CloseHandle (hFile) ;
  80.           return NULL ;
  81.      }
  82.  
  83.      pbmfh = malloc (dwFileSize) ;
  84.  
  85.      if (!pbmfh)
  86.      {
  87.           CloseHandle (hFile) ;
  88.           return NULL ;
  89.      }
  90.  
  91.      bSuccess = ReadFile (hFile, pbmfh, dwFileSize, &dwBytesRead, NULL) ;
  92.      CloseHandle (hFile) ;
  93.  
  94.           // Verify the file
  95.  
  96.      if (!bSuccess || (dwBytesRead != dwFileSize)         
  97.                    || (pbmfh->bfType != * (WORD *) "BM") 
  98.                    || (pbmfh->bfSize != dwFileSize))
  99.      {
  100.           free (pbmfh) ;
  101.           return NULL ;
  102.      }
  103.  
  104.           // Create the DDB 
  105.  
  106.      hBitmap = CreateDIBitmap (hdc,              
  107.                                (BITMAPINFOHEADER *) (pbmfh + 1),
  108.                                CBM_INIT,
  109.                                (BYTE *) pbmfh + pbmfh->bfOffBits,
  110.                                (BITMAPINFO *) (pbmfh + 1),
  111.                                DIB_RGB_COLORS) ;
  112.      free (pbmfh) ;
  113.  
  114.      return hBitmap ;
  115. }
  116.  
  117. LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  118. {
  119.      static HBITMAP      hBitmap ;
  120.      static int          cxClient, cyClient ;
  121.      static OPENFILENAME ofn ;
  122.      static TCHAR        szFileName [MAX_PATH], szTitleName [MAX_PATH] ;
  123.      static TCHAR        szFilter[] = TEXT ("Bitmap Files (*.BMP)\0*.bmp\0")
  124.                                       TEXT ("All Files (*.*)\0*.*\0\0") ;
  125.      BITMAP              bitmap ;
  126.      HDC                 hdc, hdcMem ;
  127.      PAINTSTRUCT         ps ;
  128.  
  129.      switch (message)
  130.      {
  131.      case WM_CREATE:
  132.           ofn.lStructSize       = sizeof (OPENFILENAME) ;
  133.           ofn.hwndOwner         = hwnd ;
  134.           ofn.hInstance         = NULL ;
  135.           ofn.lpstrFilter       = szFilter ;
  136.           ofn.lpstrCustomFilter = NULL ;
  137.           ofn.nMaxCustFilter    = 0 ;
  138.           ofn.nFilterIndex      = 0 ;
  139.           ofn.lpstrFile         = szFileName ;
  140.           ofn.nMaxFile          = MAX_PATH ;
  141.           ofn.lpstrFileTitle    = szTitleName ;
  142.           ofn.nMaxFileTitle     = MAX_PATH ;
  143.           ofn.lpstrInitialDir   = NULL ;
  144.           ofn.lpstrTitle        = NULL ;
  145.           ofn.Flags             = 0 ;
  146.           ofn.nFileOffset       = 0 ;
  147.           ofn.nFileExtension    = 0 ;
  148.           ofn.lpstrDefExt       = TEXT ("bmp") ;
  149.           ofn.lCustData         = 0 ;
  150.           ofn.lpfnHook          = NULL ;
  151.           ofn.lpTemplateName    = NULL ;
  152.  
  153.           return 0 ;
  154.  
  155.      case WM_SIZE:
  156.           cxClient = LOWORD (lParam) ;
  157.           cyClient = HIWORD (lParam) ;
  158.           return 0 ;
  159.  
  160.      case WM_COMMAND:
  161.           switch (LOWORD (wParam))
  162.           {
  163.           case IDM_FILE_OPEN:
  164.  
  165.                     // Show the File Open dialog box
  166.  
  167.                if (!GetOpenFileName (&ofn))
  168.                     return 0 ;
  169.                
  170.                     // If there's an existing DIB, delete it
  171.  
  172.                if (hBitmap)
  173.                {
  174.                     DeleteObject (hBitmap) ;
  175.                     hBitmap = NULL ;
  176.                }
  177.                     // Create the DDB from the DIB
  178.  
  179.                SetCursor (LoadCursor (NULL, IDC_WAIT)) ;
  180.                ShowCursor (TRUE) ;
  181.  
  182.                hdc = GetDC (hwnd) ;
  183.                hBitmap = CreateBitmapObjectFromDibFile (hdc, szFileName) ;
  184.                ReleaseDC (hwnd, hdc) ;
  185.  
  186.                ShowCursor (FALSE) ;
  187.                SetCursor (LoadCursor (NULL, IDC_ARROW)) ;
  188.  
  189.                     // Invalidate the client area for later update
  190.  
  191.                InvalidateRect (hwnd, NULL, TRUE) ;
  192.  
  193.                if (hBitmap == NULL)
  194.                {
  195.                     MessageBox (hwnd, TEXT ("Cannot load DIB file"), 
  196.                                 szAppName, MB_OK | MB_ICONEXCLAMATION) ;
  197.                }
  198.                return 0 ;
  199.           }
  200.           break ;
  201.  
  202.      case WM_PAINT:
  203.           hdc = BeginPaint (hwnd, &ps) ;
  204.  
  205.           if (hBitmap)
  206.           {
  207.                GetObject (hBitmap, sizeof (BITMAP), &bitmap) ;
  208.  
  209.                hdcMem = CreateCompatibleDC (hdc) ;
  210.                SelectObject (hdcMem, hBitmap) ;
  211.  
  212.                BitBlt (hdc,    0, 0, bitmap.bmWidth, bitmap.bmHeight, 
  213.                        hdcMem, 0, 0, SRCCOPY) ;
  214.  
  215.                DeleteDC (hdcMem) ;
  216.           }
  217.  
  218.           EndPaint (hwnd, &ps) ;
  219.           return 0 ;
  220.           
  221.      case WM_DESTROY:
  222.           if (hBitmap)
  223.                DeleteObject (hBitmap) ;
  224.  
  225.           PostQuitMessage (0) ;
  226.           return 0 ;
  227.      }
  228.      return DefWindowProc (hwnd, message, wParam, lParam) ;
  229. }
  230.